package cn.lhl.flowable.task;

import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.task.api.Task;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component("mulitiInstanceTaskListener")
public class MulitiInstanceTaskListener  {
    @Resource
    private TaskService taskService;


    @Async
    //每个任务完成的监听
    public void completeListener(DelegateExecution execution) {
        System.out.println("任务：" + execution.getId());
        System.out.println("persons:" + execution.getVariable("persons"));
        System.out.println("person" + execution.getVariable("person"));

       /* nrOfInstances：实例总数。
          nrOfActiveInstances：当前活动的（即未完成的），实例数量。对于顺序多实例，这个值总为1。
        nrOfCompletedInstances：已完成的实例数量。*/

    }

    //每个任务创建的监听
    // create事件用于设置审批人  任务分发审批人
    public void createListener(DelegateExecution execution) {
        /*System.out.println("任务：" + execution.getId());
        System.out.println("persons:" + execution.getVariable("persons"));
        System.out.println("person" + execution.getVariable("person"));*/

        String candidateGroupkval="mmmmm"; //elementVariable
        List<Task> tasks = taskService.createTaskQuery()
                .taskCandidateGroup(candidateGroupkval)
                //.taskVariableValueEquals("person","use3")
                //.taskVariableExists("su")
                .orderByTaskCreateTime() // 按照任务创建时间
                .desc() // 倒序排列
                .list();

        System.out.println("createListener__tasks>>>"+tasks);

        String s = "a418bf73-31de-11ee-8472-086ac5117fab";

        String person = (String) execution.getVariable("person");
        //
        //System.out.println(execution.getTransientVariables());

        //System.out.println(execution.getVariableInstances());

        //当前的
        //System.out.println(execution.getVariableInstancesLocal());

        //当前的
        System.out.println("getVariables>>>"+execution.getVariables());

        String taskid = execution.getId();

        String currentActivityId = execution.getCurrentActivityId();

        Task task = taskService.createTaskQuery().taskId(s).singleResult();
       // List<Task> list = taskService.createTaskQuery().taskDefinitionKey().list();


        System.out.println(task);

        /*if (task.getAssignee() == null) {
            taskService.claim(task.getId(), (String) execution.getVariable("person"));//领取任务 或分配任务
            System.out.println(task.getAssignee());
        }*/
    }


    //监听器的配置 支持指定类(实现TaskListener接口)
    /*<extensionElements>
        <flowable:taskListener class="com.owater.demoflowable.listener.FlowTaskListener" event="create" />
    </extensionElements>*/

    //指定表达式  flowTaskListener受spring管理的组件  运行在任务创建之前
    /*<extensionElements>
        <flowable:taskListener expression="${flowTaskListener.test(execution)}" event="create" />
    </extensionElements>*/

    //委托表达式  flowTaskListener类(实现TaskListener接口) 且受spring管理
    /*<extensionElements>
        <flowable:taskListener delegateExpression="${flowTaskListener}" event="create" />
    </extensionElements>*/


    //create（创建）:在任务被创建且所有的任务属性设置完成后才触发   create事件用于设置审批人
    //assignment（指派）：在任务被分配给某个办理人之后触发  在create前执行
    //complete（完成）：在配置了监听器的上一个任务完成时触发
    //delete（删除）：在任务即将被删除前触发。请注意 任务由completeTask正常完成时也会触发

    // 888888888    <userTask   flowable:assignee="${assignee}"  这样动态 可以 省去 创建分发任务的监听

    /**
     * flowable:assignee="${assignee}"   单任务 单人执行
     *
     *  flowable:candidateGroups=${candidateGroups}  单任务 可多人抢着执行
     *
        <multiInstanceLoopCharacteristics isSequential="false"  false并行  true 串行
     */


    /**
     * 封装     1  流程启动  2 任务完成条件  3 任务多人会签  4 单任务多人抢签
     */
}
